package com.linzelin.config;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * SpringSecurity配置类
 */
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    //加上@EnableWebSecurity并继承WebSecurityConfigurerAdapter就代表这个配置类被Spring接管了

    /**
     * 这里选择重写跟Http相关的类
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/").permitAll()
                //这个就是配置的对首页的访问是所有人都可以的
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");
                //这里分别是设定level1,2,3分别需要对应的vip1,2,3才能使用

        http.logout().logoutSuccessUrl("/");
        //这个就是开启注销功能了,后面这个就是配置注销完成之后跳转的界面了

        //http.csrf().disable();
        //这个就是关闭csrf功能的代码了,不过推荐不要关闭

        //开启记住我功能
        http.rememberMe().rememberMeParameter("remember-me");
        //这里后面的是表示记住我这个功能对应的标签的名称

        //http.formLogin();
        //没有权限就会跳到默认的登录界面,这个就是配置默认登录界面的

        http.formLogin().loginPage("/toLogin")
                //这里是指定SpringSecurity跳转的登录页面
                .loginProcessingUrl("/forLogin")
                //这里是指定SpringSecurity登录后用户名和密码提交的url
                .usernameParameter("user")
                //这个是指定提交的用户名标签的名称
                .passwordParameter("pwd");
                //这个是指定提交的密码的标签
        //这样就是配置的我们自定义的这个页面路径下的页面为登录界面
    }

    /**
     *     这个就是认证对应的类
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("lin").password(new BCryptPasswordEncoder().encode("123456")).roles("vip3","vip2","vip1")
                .and()
                .withUser("xie").password(new BCryptPasswordEncoder().encode("123456")).roles("vip1")
                //这个就是配置一些基本的用户角色了
                //这里如果要配置用户角色需要使用 and()来拼接
                .and()
                .passwordEncoder(new BCryptPasswordEncoder());
                 //不过要注意这里的密码需要配置加密,不然登录了会报500没有加密错误
    }
}
